﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Infrastructure.Helper;
using Infrastructure.Model;

namespace Infrastructure.Cache
{
    /// <summary>
    /// 内存指标客户端（支持跨平台）
    /// 功能：获取系统内存使用指标（总内存/已用内存/空闲内存）
    /// </summary>
    public class MemoryMetricsClient
    {
        /// <summary>
        /// 获取当前系统内存指标
        /// </summary>
        /// <returns>
        /// 内存指标对象（包含 Total/Used/Free 内存，单位：MB）
        /// </returns>
        public MemoryMetrics GetMetrics()
        {
            // 根据操作系统类型选择对应的获取方式
            return ComputerHelper.IsUnix()
                ? GetUnixMetrics()   // Unix/Linux/MacOS 系统
                : GetWindowsMetrics(); // Windows 系统
        }

        /// <summary>
        /// 获取 Windows 系统内存指标
        /// 实现原理：通过执行 wmic 命令获取原始内存数据
        /// </summary>
        private MemoryMetrics GetWindowsMetrics()
        {
            // 执行 WMIC 命令获取内存信息（单位：KB）
            // 命令示例：wmic OS get FreePhysicalMemory,TotalVisibleMemorySize /Value
            var output = ShellHelper.Cmd("wmic", "OS get FreePhysicalMemory,TotalVisibleMemorySize /Value");

            // 清理并分割命令行输出结果
            var lines = output.Trim().Split('\n'); // 按行分割
            var freeLineParts = lines[0].Split('=', '\u0001'); // 分割空闲内存行（特殊字符\u0001作为分隔符）
            var totalLineParts = lines[1].Split('=', '\u0001'); // 分割总内存行

            // 解析并转换单位（KB → MB）
            var metrics = new MemoryMetrics();
            metrics.Total = Math.Round(double.Parse(totalLineParts[1]) / 1024);  // 总内存（MB）
            metrics.Free = Math.Round(double.Parse(freeLineParts[1]) / 1024);    // 空闲内存（MB）
            metrics.Used = metrics.Total - metrics.Free;                        // 已用内存（总 - 空闲）

            return metrics;
        }

        /// <summary>
        /// 获取 Unix 系统内存指标（Linux/MacOS）
        /// 实现原理：通过执行 free -m 命令获取原始内存数据
        /// </summary>
        private MemoryMetrics GetUnixMetrics()
        {
            // 执行 free -m 命令（-m 表示以 MB 为单位显示）
            var output = ShellHelper.Bash("free -m");

            // 解析命令行输出结果
            var lines = output.Split('\n');
            var memoryLineParts = lines[1]          // 第二行为内存数据行
                .Split(' ', '\u0001')               // 按空格和特殊字符分割
                .Where(x => !string.IsNullOrWhiteSpace(x)) // 过滤空值
                .ToArray();

            // 直接读取已换算为 MB 的数值
            var metrics = new MemoryMetrics();
            metrics.Total = double.Parse(memoryLineParts[1]);  // 总内存
            metrics.Used = double.Parse(memoryLineParts[2]);   // 已用内存
            metrics.Free = double.Parse(memoryLineParts[3]);   // 空闲内存

            return metrics;
        }
    }
}
